#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"scene.h"
#include "map.h"
#include"enermy.h"
#include <QIcon>
#include<QPainter>
#include<QMouseEvent>
#include<ctime>
#include<QMessageBox>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    InitScene();
    //初始化场景
    start();
    //开始游戏

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::InitScene()
{
    setFixedSize(scene_width,scene_height);
    setWindowTitle(scene_title);
    setWindowIcon(QIcon(":/images/Icon"));
    //设置窗口尺寸、标题、图标
    timer.setInterval(15);
    //设置时间间隔
    enermy_recorder=0;
    //敌机出场间隔初始化
    srand((unsigned int)time (NULL));

}

void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.drawPixmap(0,m_map.map1_y,m_map.map1);
    painter.drawPixmap(0,m_map.map2_y,m_map.map2);
    //绘制地图
    painter.drawPixmap(plane.plane_x,plane.plane_y,plane.plane_picture);
    //绘制飞机
    for(int i=0;i<100;i++){
        if(plane.bullets[i].bullet_situation==false){
            painter.drawPixmap(plane.bullets[i].bullet_x,plane.bullets[i].bullet_y,plane.bullets[i].bullet_picture);
        }
        //只绘制非空闲子弹
    }
    //绘制子弹
    for(int i=0;i<100;i++){
        if(enermys[i].enermy_situation==false){
            painter.drawPixmap(enermys[i].enermy_x,enermys[i].enermy_y,enermys[i].enermy_picture);
        }
        //只绘制非空闲子弹
    }
    //绘制子弹
}

void MainWindow::mouseMoveEvent(QMouseEvent * event)
{
    ui->centralWidget->setMouseTracking(true);
    setMouseTracking(true);
    //捕捉鼠标移动事件：要先把 QMainWindow 的 CentrolWidget 使用 setMouseTracking(true) 开启移动监视。然后再把 QMainWindow 的 setMouseTracking(true) 开启监视。
    int x=event->x()-plane.plane_spuare.width()/2;
    int y=event->y()-plane.plane_spuare.height()/2;
    //获取鼠标位置,并使鼠标始终位于飞机中央
    if(x<=0){
        x=0;
    }
    if(x>=scene_width-plane.plane_spuare.width()){
        x=scene_width-plane.plane_spuare.width();
    }
    if(y<=0){
        y=0;
    }
    if(y>=scene_height-plane.plane_spuare.height()){
        y=scene_height-plane.plane_spuare.height();
    }
    //防止飞机超出边界
    plane.newplane(x,y);

}

void MainWindow::enermy_showup()
{
    enermy_recorder++;
    //累加时间间隔
    if(enermy_recorder>=45){
        enermy_recorder=0;
        for(int i=0;i<100;i++){
            if(enermys[i].enermy_situation){
                enermys[i].enermy_situation=false;
                enermys[i].enermy_x=rand()%(scene_width-enermys[i].enermy_square.width());
                enermys[i].enermy_y=-enermys[i].enermy_square.height();
                break;
            }
            //选取空闲的飞机出场
        }
    }
    //每次累积到45ms为一次出场时间

}

void MainWindow::hit()
{
    for(int i=0;i<100;i++){
        if(enermys[i].enermy_situation) continue;
        for(int j=0;j<100;j++){
            if(plane.bullets[j].bullet_situation) continue;
            QRect res=plane.bullets[j].bullet_square;
            bool localIntersects = res.intersects(enermys[i].enermy_square);
            if(localIntersects){
                enermys[i].enermy_situation=true;
                plane.bullets[j].bullet_situation=true;
                score+=10;
            }
            //只有子弹和敌机都为非空闲，并且二者矩形相交时，才算碰撞，得分加十
        }
    }
}

void MainWindow::over()
{
    for(int i=0;i<100;i++){
        if(enermys[i].enermy_situation) continue;
    if(plane.plane_spuare.intersects(enermys[i].enermy_square)){
        QMessageBox::information(NULL,"Game Over","The score is "+tr("%1").arg(score)+".");
        this->close();
    }
    //显示得分，游戏结束
    }
}

void MainWindow::newmainwindow()
{
    m_map.newmap();
    //更新地图坐标
    plane.shoot();
    //发射子弹
    for(int i=0;i<100;i++){
        if(plane.bullets[i].bullet_situation==false){
            plane.bullets[i].newbullet();
        }
    }
    //更新所有非空闲子弹的位置
    for(int i=0;i<100;i++){
        if(enermys[i].enermy_situation==false){
            enermys[i].newenermy();
        }
    }
    //更新所有非空闲敌机的位置

}

void MainWindow::start()
{
    timer.start();
    //启动定时器
    score=0;
    //得分初始化
    connect(&timer,&QTimer::timeout,[=](){
        newmainwindow();
        //更新元素坐标
        update();
        //系统函数，重新绘制
        enermy_showup();
        //敌机出场
        hit();
        //敌机检测
        over();
        //游戏结束
    });
    //每隔15毫米，发送时间结束信号，捕获信号
}


